local Text = require "widgets/text" -- 引入 Text 控件库
local Image = require "widgets/image" -- 引入 Image 控件库
local ImageButton = require "widgets/imagebutton" -- 引入 ImageButton 控件库
local CheckBox = require("core_ShadowFieldExciter/widgets/CheckBox") -- 引入自定义的 CheckBox 控件库
local ScrollList_ds = require("core_ShadowFieldExciter/widgets/ScrollList_DS") -- 引入自定义的 ScrollList_ds 控件库
-- print("ScrollList_ds 模块加载成功")
local db = TUNING.MOD_ShadowFieldExciter -- 获取模组的配置数据
local strings = STRINGS.MOD_ShadowFieldExciter -- 获取模组的本地化字符串

AddClassPostConstruct("widgets/containerwidget", function(self) -- 对 ContainerWidget 类进行后构造修改
    local _Open = self.Open -- 保存原始的 Open 方法
    local _Close = self.Close -- 保存原始的 Close 方法
    local _OnItemGet = self.OnItemGet -- 保存原始的 OnItemGet 方法

    self.custom_ui_elements = {} -- 初始化一个表来存储自定义添加的 UI 元素
    
    function self:Open(inst, doer) -- 重写 Open 方法
        _Close(self) -- 先关闭之前的 UI
        _Open(self, inst, doer) -- 调用原始的 Open 方法
        self.custom_ui_elements = {} -- 清空之前可能存在的自定义 UI 元素，确保每次打开都是新的状态

        if inst.prefab == db.Prefab_ID then
            inst.SoundEmitter:PlaySound("Shadow_Field_Exciter_soundfx/Shadow_Field_Exciter_container/open") -- 播放打开容器的音效
            -- 临时存储 doer，Close 时可能需要
            self.doer = doer
            self.instance = inst
            local WhiteGridList, BlackGridList -- 声明列表变量

            --#region 辅助函数

            -- 浅拷贝函数
            local function ShallowCopy(original_table)
                if type(original_table) ~= "table" then
                    return original_table -- 如果不是表，直接返回原值
                end
                local copy = {}
                for key, value in pairs(original_table) do
                    copy[key] = value -- 复制键值对
                end
                return copy
            end

            -- 检查list中是否有item
            local function IsListHasItem(list, item_name)
                for _, value in ipairs(list) do if value == item_name then return true end end
                return false
            end
            -- 从list中移除item
            local function RemoveItemFromList(list, item_name)
                for i = #list, 1, -1 do if list[i] == item_name then table.remove(list, i) end end
            end
            -- 添加item到list中，已处理黑白名单互斥和防止重复添加
            local function AddItemToList(list,item_name)
                if list == self.ItemWhiteList then
                    RemoveItemFromList(self.ItemBlackList,item_name)
                    if not IsListHasItem(self.ItemWhiteList,item_name) then table.insert(self.ItemWhiteList,item_name) end
                elseif list == self.ItemBlackList then
                    RemoveItemFromList(self.ItemWhiteList,item_name)
                    if not IsListHasItem(self.ItemBlackList,item_name) then table.insert(self.ItemBlackList,item_name) end
                end
            end
            
            -- 得到容器组件里面的物品预制物列表
            local function GetAllItemsPrefabInContainer(inst)
                local prefabs = {}
                if not inst or not inst.components or not inst.components.container then
                    return
                end
                for i = 1, inst.components.container.numslots do
                    local item = inst.components.container:GetItemInSlot(i)
                    if item and item.prefab then 
                        table.insert(prefabs, item.prefab)
                    end
                end
                return prefabs
            end

            -- 刷新列表显示
            local function RefreshList()
                if WhiteGridList then WhiteGridList:UpdateGridByItemsData(self.ItemWhiteList) end
                if BlackGridList then BlackGridList:UpdateGridByItemsData(self.ItemBlackList) end
            end

            -- 移动容器物品到玩家身上
            local function MoveItemsToPlayer()
                if self.doer and self.doer.components.inventory then
                    local num_slots = inst.components.container:GetNumSlots()
                    for slot = 1, num_slots, 1 do
                        local item = inst.components.container:GetItemInSlot(slot)
                        if item then
                            local remove_item = inst.components.container:RemoveItem(item,true)
                            self.doer.components.inventory:GiveItem(remove_item) -- 将物品移动到玩家身上
                        end
                    end
                end
            end

            -- 检查物品的图标和纹理
            local function CheckPrefabAtlasAndTex(prefab)
                if prefab == 'cutlichen' then
                    return "images/inventoryimages.xml", "algae.tex" -- 苔藓处理
                elseif prefab == 'deadlyfeast' then
                    return "images/inventoryimages.xml", "bonestew.tex" -- 致命盛宴处理
                elseif prefab == 'maxwellkey' then
                    return "images/inventoryimages.xml", "purplegem.tex" -- 暗影钥匙处理
                elseif prefab == 'corkboat_item' then
                    return "images/inventoryimages.xml", "corkboat.tex" -- 碗状软木舟处理
                elseif prefab == 'doydoybaby' then
                    return "images/inventoryimages.xml", "doydoy_baby.tex" -- 渡渡鸟宝宝处理
                elseif prefab == 'doydoyegg_cracked' then
                    return "images/inventoryimages.xml", "doydoyegg.tex" -- 渡渡鸟蛋处理
                elseif prefab == 'fish_med' then
                    return "images/inventoryimages.xml", "fish_dogfish.tex" -- 死狗鱼处理
                elseif prefab == 'fish_raw_small_cooked' then
                    return "images/inventoryimages.xml", "fishtropical_cooked.tex" -- 熟小鱼块处理
                elseif prefab == 'glowfly' then
                    return "images/inventoryimages.xml", "lantern_fly.tex" -- 发光飞虫处理
                elseif prefab == 'mosquito_poison' then
                    return "images/inventoryimages.xml", "mosquito_yellow.tex" -- 毒蚊子处理
                elseif prefab == 'ro_bin_gizzard_stone' then
                    return "images/inventoryimages.xml", "ro_bin_gem.tex" -- 露比的砂囊石处理
                elseif prefab == 'roc_robin_egg' then
                    return "images/inventoryimages.xml", "roc_egg.tex" -- 岩蛋处理
                elseif prefab == 'tunacan' then
                    if db.HAM_DLC then
                        return "images/inventoryimages_2.xml", "tuna.tex" -- 哈姆雷特DLC金枪鱼罐头处理
                    else
                        return "images/inventoryimages.xml", "tuna.tex" -- 原版或其他DLC金枪鱼罐头处理
                    end
                elseif prefab == 'webberskull' then
                    return "images/inventoryimages.xml", "skull_webber.tex" -- 韦伯的头骨处理
                end
                return nil,nil -- 如果没有特殊处理，返回 nil
            end

            -- 隐藏特殊图标背景,在打开时调用一次
            local function HideSpecialItemBg()
                if self.inv then
                    for k, v in pairs(self.inv) do
                        if v.tile then
                            if v.tile.bg then
                                v.tile.bg:Hide() -- 隐藏物品图标背景
                            end
                            if v.tile.spoilage then
                                v.tile.spoilage:Hide() -- 隐藏物品腐烂进度条
                            end
                            if v.tile.wetness then
                                v.tile.wetness:Hide() -- 隐藏物品潮湿进度条
                                end
                            if v.tile.fusebg then
                                v.tile.fusebg:Hide() -- 隐藏物品fusebg进度条
                            end
                            if v.tile.invspace then
                                v.tile.invspace:Hide() -- 隐藏物品invspace进度条
                            end
                            if v.tile.obsidian_charge then
                                v.tile.obsidian_charge:Hide() -- 隐藏物品obsidian_charge进度条
                            end
                        end
                    end
                end
            end

            --#endregion

            -- 获取本地数据
            self.ItemWhiteList = ShallowCopy(inst.ItemWhiteList or {})  -- 获取白名单数据
            self.ItemBlackList = ShallowCopy(inst.ItemBlackList or {})  -- 获取黑名单数据
            self.CollectRule = ShallowCopy(inst.CollectRule or {})  -- 获取收集规则数据
            self.CollectMode = ShallowCopy(inst.CollectMode or {})  -- 获取收集模式数据
            -- 定义规则顺序
            local ruleKeys = {
                "IgnoreWeapon",
                "IgnoreArmor",
                "IgnoreAmulet",
                "IgnoreUnStackable",
                "IgnoreFood",
                "IgnoreSomething"
            }
            -- 定义模式顺序
            local modeKeys = {
                "MatchMode"
            }

            --#region 白名单 Title (使用 Text)
            local whiteList_text = self:AddChild(Text(strings.Title_Font, strings.Title_Font_Size))
            whiteList_text:SetString(strings.Lab_WhiteList)
            whiteList_text:SetColour(1,1,1,1)
            whiteList_text:SetPosition(165,210,0) -- 可能需要调整位置
            whiteList_text:SetVAlign(ANCHOR_MIDDLE)
            whiteList_text:SetHAlign(ANCHOR_MIDDLE)
            table.insert(self.custom_ui_elements, whiteList_text)

            --#endregion

            --#region 黑名单 Title (使用 Text)
            local blackList_text = self:AddChild(Text(strings.Title_Font, strings.Title_Font_Size))
            blackList_text:SetString(STRINGS.MOD_ShadowFieldExciter.Lab_BlackList)
            blackList_text:SetColour(0.5, 0.5, 0.5, 1)
            blackList_text:SetPosition(-172,210,0) -- 可能需要调整位置
            blackList_text:SetVAlign(ANCHOR_MIDDLE)
            blackList_text:SetHAlign(ANCHOR_MIDDLE)
            table.insert(self.custom_ui_elements, blackList_text)
            --#endregion

            --#region 白名单列表 (使用 ScrollGridList_ds)
            WhiteGridList = self:AddChild(ScrollList_ds(
                self.ItemWhiteList, -- 物品数据列表
                {
                    grid_option = {wide=63,high=63}, -- 网格选项
                    rows = 5, -- 行数
                    cols = 4, -- 列数
                    click_stepsize = 1, -- 点击步长
                    scroll_stepsize = 1, -- 滚动步长
                    items_data_processfn = function(items_data)
                        local items_data_processed = {} -- 初始化处理后的物品数据列表
                        for _, item_data in ipairs(items_data) do
                            local atlas,tex = CheckPrefabAtlasAndTex(item_data) -- 检查物品预制物和图集
                            -- print("物品 prefab:"..item_data..'图集路径'..tostring(atlas)) -- 调试输出
                            table.insert(items_data_processed, {
                                prefab = item_data, -- 物品 prefab 名称
                                atlas = atlas or GetInventoryItemAtlas(item_data..".tex"), -- 获取物品图标所在的图集
                                tex = tex or item_data..".tex", -- 物品纹理文件名
                                normal = tex or item_data..".tex", -- 正常状态纹理
                                focus = tex or item_data..".tex", -- 聚焦状态纹理
                                tooltip = STRINGS.NAMES[string.upper(item_data)] or item_data, -- 工具提示文本
                                onclick = function(prefab) -- 左键点击事件回调
                                    print("点击白名单物品:", prefab) -- 调试输出
                                    -- 左键：将物品从白名单移到黑名单
                                    AddItemToList(self.ItemBlackList, prefab) -- 调用辅助函数将物品添加到黑名单
                                    RefreshList() -- 刷新列表显示
                                end,
                                onrightclick = function(prefab) -- 右键点击事件回调
                                    print("右键点击白名单物品:", prefab) -- 调试输出
                                    -- 右键：从白名单中移除物品
                                    RemoveItemFromList(self.ItemWhiteList, prefab) -- 调用辅助函数从白名单移除物品
                                    -- 刷新列表显示
                                    RefreshList() -- 刷新列表显示
                                end
                            })
                        end
                        return items_data_processed -- 返回处理后的物品数据列表
                    end, -- 物品数据处理函数
                    grid_processfn = function(list_data)
                        local imgbtn = ImageButton(list_data.atlas, list_data.normal, list_data.focus) -- 创建 ImageButton
                        imgbtn:SetTooltip(list_data.tooltip) -- 设置工具提示
                        imgbtn:SetOnClick(function() -- 点击事件回调
                            if list_data.onclick then list_data.onclick(list_data.prefab) end -- 调用物品数据的点击事件
                        end)
                        local old_OnControl = imgbtn.OnControl -- 保存原始的 OnControl 方法
                        imgbtn.OnControl = function(self, control, down) -- 重写 OnControl 方法来处理右键点击
                            if control == CONTROL_SECONDARY and down and list_data.onrightclick then -- 如果是鼠标右键按下 (CONTROL_SECONDARY) 且数据项中有 onrightclick 回调 --处理右键点击事件
                                list_data.onrightclick(list_data.prefab) -- 执行数据项中的 onrightclick 回调
                                return true -- 返回 true 表示事件已处理
                            end
                            return old_OnControl(self, control, down) -- 否则调用原始的 OnControl 方法处理其他控制事件
                        end
                        return imgbtn -- 返回创建的 ImageButton
                    end, -- 网格处理函数,要返回一个继承自widget的对象
                    up_arrowbtn_data = { -- 上箭头按钮数据
                        atlas = "images/my_futuristic_ui/my_futuristic_ui.xml",
                        tex = "white_scrollbar_arrow_up.tex",
                        scale = {0.2, 0.2},
                        offset = {126+38, 140}
                    },
                    down_arrowbtn_data = { -- 下箭头按钮数据
                        atlas = "images/my_futuristic_ui/my_futuristic_ui.xml",
                        tex = "white_scrollbar_arrow_down.tex",
                        scale = {0.2, 0.2},
                        offset = {126+38, -140}
                    }
                }
            ))
            WhiteGridList:SetPosition(165,-28,0) -- 可能需要调整位置
            table.insert(self.custom_ui_elements, WhiteGridList) -- 将白名单列表添加到自定义 UI 元素列表中
            --#endregion

            --#region 黑名单列表 (使用 ScrollGridList_ds)
            BlackGridList = self:AddChild(ScrollList_ds(
                self.ItemBlackList, -- 物品数据列表
                {
                    grid_option = {wide=64,high=63}, -- 网格选项
                    rows = 5, -- 行数
                    cols = 4, -- 列数
                    click_stepsize = 1, -- 点击步长
                    scroll_stepsize = 1, -- 滚动步长
                    items_data_processfn = function(items_data)
                        local items_data_processed = {} -- 初始化处理后的物品数据列表
                        for _, item_data in ipairs(items_data) do
                            local atlas, tex = CheckPrefabAtlasAndTex(item_data) -- 检查物品预制物和图集
                            table.insert(items_data_processed, {
                                prefab = item_data, -- 物品 prefab 名称
                                atlas = atlas or GetInventoryItemAtlas(item_data..".tex"), -- 获取物品图标所在的图集
                                tex = tex or item_data..".tex", -- 物品纹理文件名
                                normal = tex or item_data..".tex", -- 正常状态纹理
                                focus = tex or item_data..".tex", -- 聚焦状态纹理
                                tooltip = STRINGS.NAMES[string.upper(item_data)] or item_data, -- 工具提示文本
                                onclick = function(prefab) -- 左键点击事件回调
                                    print("点击黑名单物品:", prefab) -- 调试输出
                                    -- 左键：将物品从黑名单移到白名单
                                    AddItemToList(self.ItemWhiteList, prefab) -- 调用辅助函数将物品添加到白名单
                                    RefreshList() -- 刷新列表显示
                                end,
                                onrightclick = function(prefab) -- 右键点击事件回调
                                    print("右键点击黑名单物品:", prefab) -- 调试输出
                                    -- 右键：从黑名单中移除物品
                                    RemoveItemFromList(self.ItemBlackList, prefab) -- 调用辅助函数从黑名单移除物品
                                    -- 刷新列表显示
                                    RefreshList() -- 刷新列表显示
                                end
                            })
                        end
                        return items_data_processed -- 返回处理后的物品数据列表
                    end, -- 物品数据处理函数
                    grid_processfn = function(list_data)
                        local imgbtn = ImageButton(list_data.atlas, list_data.normal, list_data.focus) -- 创建 ImageButton
                        imgbtn:SetTooltip(list_data.tooltip) -- 设置工具提示
                        imgbtn:SetOnClick(function() -- 点击事件回调
                            if list_data.onclick then list_data.onclick(list_data.prefab) end -- 调用物品数据的点击事件
                        end)
                        local old_OnControl = imgbtn.OnControl -- 保存原始的 OnControl 方法
                        imgbtn.OnControl = function(self, control, down) -- 重写 OnControl 方法来处理右键点击
                            if control == CONTROL_SECONDARY and down and list_data.onrightclick then -- 如果是鼠标右键按下 (CONTROL_SECONDARY) 且数据项中有 onrightclick 回调 --处理右键点击事件
                                list_data.onrightclick(list_data.prefab) -- 执行数据项中的 onrightclick 回调
                                return true -- 返回 true 表示事件已处理
                            end
                            return old_OnControl(self, control, down) -- 否则调用原始的 OnControl 方法处理其他控制事件
                        end
                        return imgbtn -- 返回创建的 ImageButton
                    end, -- 网格处理函数,要返回一个继承自widget的对象
                    up_arrowbtn_data = { -- 上箭头按钮数据
                        atlas = "images/my_futuristic_ui/my_futuristic_ui.xml",
                        tex = "black_scrollbar_arrow_up.tex",
                        scale = {0.2, 0.2},
                        offset = {128+38, 140}
                    },
                    down_arrowbtn_data = { -- 下箭头按钮数据
                        atlas = "images/my_futuristic_ui/my_futuristic_ui.xml",
                        tex = "black_scrollbar_arrow_down.tex",
                        scale = {0.2, 0.2},
                        offset = {128+38, -140}
                    }
                }
            ))
            BlackGridList:SetPosition(-172, -28,0) -- 可能需要调整位置
            table.insert(self.custom_ui_elements, BlackGridList) -- 将黑名单列表添加到自定义 UI 元素列表中
            --#endregion

            --#region 添加白名单按钮 (使用 ImageButton)
            local AddItemWhiteListBtn = self:AddChild(ImageButton("images/my_futuristic_ui/my_futuristic_ui.xml","white_plus_button_normal.tex","white_plus_button_hover.tex","white_plus_button_disabled.tex"))
            AddItemWhiteListBtn:SetTooltip(strings.Btn_AddWhiteList_ToolTip)
            AddItemWhiteListBtn:SetOnClick(function ()
                local prefabs = GetAllItemsPrefabInContainer(inst) -- 获取容器中的物品列表
                if prefabs then
                    for _, prefab in ipairs(prefabs) do
                        AddItemToList(self.ItemWhiteList, prefab) -- 添加到白名单
                    end
                end
                MoveItemsToPlayer() -- 移动物品到玩家身上
                RefreshList() -- 刷新列表显示
            end)
            AddItemWhiteListBtn:SetPosition(-365,-150) -- 可能需要调整位置
            table.insert(self.custom_ui_elements, AddItemWhiteListBtn)

            --#endregion

            --#region 添加黑名单按钮 (使用 ImageButton)
            local AddItemBlackListBtn = self:AddChild(ImageButton("images/my_futuristic_ui/my_futuristic_ui.xml","black_plus_button_normal.tex","black_plus_button_hover.tex","black_plus_button_disabled.tex"))
            AddItemBlackListBtn:SetTooltip(strings.Btn_AddBlackList_ToolTip)
            AddItemBlackListBtn:SetOnClick(function ()
                local prefabs = GetAllItemsPrefabInContainer(inst) -- 获取容器中的物品列表
                if prefabs then
                    for _, prefab in ipairs(prefabs) do
                        AddItemToList(self.ItemBlackList, prefab) -- 添加到黑名单
                    end
                end
                MoveItemsToPlayer() -- 移动物品到玩家身上
                RefreshList() -- 刷新列表显示
            end)
            AddItemBlackListBtn:SetPosition(-365,120) -- 可能需要调整位置
            table.insert(self.custom_ui_elements, AddItemBlackListBtn)
            --#endregion

            --#region 清除白名单按钮 (使用 ImageButton 和 Image)
            local clearItemWhiteListBtn = self:AddChild(ImageButton("images/my_futuristic_ui/my_futuristic_ui.xml","hexagonal_down_button_normal.tex","hexagonal_down_button_hover.tex","hexagonal_down_button_disabled.tex"))
            clearItemWhiteListBtn:SetTooltip(strings.Btn_ClearWhiteList_ToolTip)
            clearItemWhiteListBtn:SetScale(1,1,1) -- 设置按钮缩放比例
            clearItemWhiteListBtn:SetOnClick(function ()
                self.ItemWhiteList = {} -- 清空白名单
                RefreshList() -- 刷新列表显示
            end)
            local btn_w,btn_h = clearItemWhiteListBtn:GetSize()
            local clearBtnIcon_1 = clearItemWhiteListBtn:AddChild(Image("images/my_futuristic_ui/my_futuristic_ui.xml", "clean_all.tex")) -- 使用 Image添加图标
            clearBtnIcon_1:ScaleToSize(29,30) -- 调整图标大小
            clearBtnIcon_1:SetPosition(0,0)
            clearItemWhiteListBtn:SetPosition(229,-213) -- 可能需要调整位置
            table.insert(self.custom_ui_elements, clearItemWhiteListBtn)
            --#endregion

            --#region 清除黑名单按钮 (使用 ImageButton 和 Image)
            local clearItemBlackListBtn = self:AddChild(ImageButton("images/my_futuristic_ui/my_futuristic_ui.xml","hexagonal_down_button_normal.tex","hexagonal_down_button_hover.tex","hexagonal_down_button_disabled.tex"))
            clearItemBlackListBtn:SetTooltip(strings.Btn_ClearBlackList_ToolTip)
            clearItemBlackListBtn:SetScale(1,1,1) -- 设置按钮缩放比例
            clearItemBlackListBtn:SetOnClick(function ()
                self.ItemBlackList = {} -- 清空黑名单
                RefreshList() -- 刷新列表显示
            end)
            btn_w,btn_h = clearItemBlackListBtn:GetSize()
            local clearBtnIcon_2 = clearItemBlackListBtn:AddChild(Image("images/my_futuristic_ui/my_futuristic_ui.xml", "clean_all.tex")) -- 使用 Image添加图标
            clearBtnIcon_2:ScaleToSize(29,30) -- 调整图标大小
            clearBtnIcon_2:SetPosition(0,0)
            clearItemBlackListBtn:SetPosition(-108,-214) -- 可能需要调整位置
            table.insert(self.custom_ui_elements, clearItemBlackListBtn)
            --#endregion

            --#region 添加CollectRule的checkbox的滑动网格
            local RuleGridList = self:AddChild(ScrollList_ds(
                self.CollectRule, -- 规则数据列表
                {
                grid_option = {wide=140,high=56.875}, -- 网格选项
                rows = 4, -- 行数
                cols = 1, -- 列数
                click_stepsize = 1, -- 点击步长
                scroll_stepsize = 1, -- 滚动步长
                items_data_processfn = function(items_data)
                    local items_data_processed = {} -- 初始化处理后的规则数据列表
                    for _, key in ipairs(ruleKeys) do
                        local value = items_data[key] -- 获取当前规则数据
                        local text = strings.CollectRule[key] or key -- 获取规则文本，如果没有则使用键名
                        if value ~= nil then
                            table.insert(items_data_processed, {
                                rule_name = key, -- 规则键名
                                rule_text = text, -- 规则文本
                                rule_value = value -- 规则是否启用
                            })
                        end
                    end
                    return items_data_processed -- 返回处理后的规则数据列表
                end,
                grid_processfn = function(list_data)
                    local checkbox = CheckBox(
                    "images/my_futuristic_ui/my_futuristic_ui.xml",  -- 图集路径
                    "white_rectangle_checkbox_normal.tex",  -- 未选中状态普通纹理
                    "white_rectangle_checkbox_focus.tex",  -- 未选中状态聚焦纹理
                    "white_rectangle_checkbox_disabled.tex",  -- 未选中状态禁用纹理
                    nil, -- 按下状态纹理 (未使用)
                    {1,1}, -- 缩放比例
                    {0,0}, -- 位置偏移
                    "white_rectangle_checkbox_check_normal.tex",  -- 选中状态普通纹理
                    "white_rectangle_checkbox_check_focus.tex",  -- 选中状态聚焦纹理
                    "white_rectangle_checkbox_check_disabled.tex",  -- 选中状态禁用纹理
                    nil) -- 创建 CheckBox
                    checkbox:SetToggle(list_data.rule_value or false, false) -- 设置初始选中状态
                    checkbox:SetOnToggle(function (checked)
                        self.CollectRule[list_data.rule_name] = checked -- 更新 CollectRule 状态
                    end)
                    local text = Text(strings.Rule_And_Mode_Font, strings.Rule_And_Mode_Font_Size) -- 创建 Text 控件显示规则文本
                    text:SetString(list_data.rule_text) -- 设置规则文本内容
                    text:SetColour(1,1,1,1) -- 设置文本颜色为白色
                    text:SetRegionSize(125,50) -- 设置文本区域大小
                    text:SetVAlign(ANCHOR_MIDDLE) -- 垂直对齐方式为中间对齐
                    text:SetHAlign(ANCHOR_MIDDLE) -- 水平对齐方式为中间对齐
                    checkbox:AddChild(text) -- 将文本添加到 CheckBox 中
                    checkbox:SetTooltip(list_data.rule_text) -- 设置 CheckBox 的工具提示为规则文本
                    return checkbox -- 返回创建的 CheckBox
                end,
                up_arrowbtn_data = {
                    atlas="images/my_futuristic_ui/my_futuristic_ui.xml", -- 上箭头按钮图集路径
                    tex="white_scrollbar_arrow_up.tex", -- 上箭头按钮纹理
                    scale={0.18, 0.18}, -- 上箭头按钮缩放比例
                    offset={70+35, 100} -- 上箭头按钮位置偏移
                }, -- 上箭头按钮数据
                down_arrowbtn_data = {
                    atlas="images/my_futuristic_ui/my_futuristic_ui.xml", -- 下箭头按钮图集路径
                    tex="white_scrollbar_arrow_down.tex", -- 下箭头按钮纹理
                    scale={0.18, 0.18}, -- 下箭头按钮缩放比例
                    offset={70+35, -100} -- 下箭头按钮位置偏移
                } -- 下箭头按钮数据
                }
            ))
            RuleGridList:SetPosition(430, 123, 0) -- 可能需要调整位置
            table.insert(self.custom_ui_elements, RuleGridList) -- 将规则列表添加到自定义 UI 元素列表中
            --#endregion

            --#region 添加CollectMode的checkbox的滑动网格
            local ModeGridList = self:AddChild(ScrollList_ds(
                self.CollectMode, -- 模式数据列表
                {
                grid_option = {wide=140,high=56.875}, -- 网格选项
                rows = 4, -- 行数
                cols = 1, -- 列数
                click_stepsize = 1, -- 点击步长
                scroll_stepsize = 1, -- 滚动步长
                items_data_processfn = function(items_data)
                    local items_data_processed = {} -- 初始化处理后的模式数据列表
                    for _, key in ipairs(modeKeys) do
                        local value = items_data[key] -- 获取当前模式数据
                        local text = strings.CollectMode[key] or key -- 获取模式文本，如果没有则使用键名
                        if value ~= nil then
                            table.insert(items_data_processed, {
                                mode_name = key, -- 模式键名
                                mode_text = text, -- 模式文本
                                mode_value = value -- 模式是否启用
                            })
                        end
                    end
                    return items_data_processed -- 返回处理后的模式数据列表
                end,
                grid_processfn = function(list_data)
                    local checkbox = CheckBox(
                    "images/my_futuristic_ui/my_futuristic_ui.xml",  -- 图集路径
                    "red_rectangle_checkbox_normal.tex",  -- 未选中状态普通纹理
                    "red_rectangle_checkbox_focus.tex",  -- 未选中状态聚焦纹理
                    "red_rectangle_checkbox_disabled.tex",  -- 未选中状态禁用纹理
                    nil, -- 按下状态纹理 (未使用)
                    {1,1}, -- 缩放比例
                    {0,0}, -- 位置偏移
                    "red_rectangle_checkbox_check_normal.tex",  -- 选中状态普通纹理
                    "red_rectangle_checkbox_check_focus.tex",  -- 选中状态聚焦纹理
                    "red_rectangle_checkbox_check_disabled.tex",  -- 选中状态禁用纹理
                    nil) -- 创建 CheckBox
                    checkbox:SetToggle(list_data.mode_value or false, false) -- 设置初始选中状态
                    checkbox:SetOnToggle(function (checked)
                        self.CollectMode[list_data.mode_name] = checked -- 更新 CollectMode 状态
                    end)
                    local text = Text(strings.Rule_And_Mode_Font,strings.Rule_And_Mode_Font_Size) -- 创建 Text 控件显示模式文本
                    text:SetString(list_data.mode_text) -- 设置模式文本内容
                    text:SetColour(1,1,1,1) -- 设置文本颜色为白色
                    text:SetRegionSize(125,50) -- 设置文本区域大小
                    text:SetVAlign(ANCHOR_MIDDLE) -- 垂直对齐方式为中间对齐
                    text:SetHAlign(ANCHOR_MIDDLE) -- 水平对齐方式为中间对齐
                    checkbox:AddChild(text) -- 将文本添加到 CheckBox 中
                    checkbox:SetTooltip(list_data.mode_text) -- 设置 CheckBox 的工具提示为模式文本
                    return checkbox -- 返回创建的 CheckBox
                end,
                up_arrowbtn_data = {
                    -- atlas="images/my_futuristic_ui/my_futuristic_ui.xml", -- 上箭头按钮图集路径
                    -- tex="white_scrollbar_arrow_up.tex", -- 上箭头按钮纹理
                    scale={0.18, 0.18}, -- 上箭头按钮缩放比例
                    offset={70+35, 100} -- 上箭头按钮位置偏移
                }, -- 上箭头按钮数据
                down_arrowbtn_data = {
                    -- atlas="images/my_futuristic_ui/my_futuristic_ui.xml", -- 下箭头按钮图集路径
                    -- tex="white_scrollbar_arrow_down.tex", -- 下箭头按钮纹理
                    scale={0.18, 0.18}, -- 下箭头按钮缩放比例
                    offset={70+35, -100} -- 下箭头按钮位置偏移
                } -- 下箭头按钮数据
                }
            ))
            ModeGridList:SetPosition(429, -125, 0) -- 可能需要调整位置
            table.insert(self.custom_ui_elements, ModeGridList) -- 将模式列表添加到自定义 UI 元素列表中
            --#endregion

            --#region 保存按钮 (使用 ImageButton 和 Image)
            local Save_Btn = self:AddChild(ImageButton("images/my_futuristic_ui/my_futuristic_ui.xml","hexagonal_up_button_normal.tex","hexagonal_up_button_hover.tex","hexagonal_up_button_disabled.tex"))
            Save_Btn:SetScale(1,1,1) -- 设置按钮缩放比例
            Save_Btn:SetTooltip(strings.Btn_Save_ToolTip)
            Save_Btn:SetOnClick(function ()
                inst.ItemWhiteList = ShallowCopy(self.ItemWhiteList or {})
                inst.ItemBlackList = ShallowCopy(self.ItemBlackList or {})
                inst.CollectRule = ShallowCopy(self.CollectRule or {})
                inst.CollectMode = ShallowCopy(self.CollectMode or {})
            end)
            local saveBtnIcon = Save_Btn:AddChild(Image("images/my_futuristic_ui/my_futuristic_ui.xml", "save_icon.tex")) -- 使用 Image 添加图标
            saveBtnIcon:ScaleToSize(30,33) -- 调整图标大小
            saveBtnIcon:SetPosition(0,0)
            Save_Btn:SetPosition(-500,300) -- 可能需要调整位置
            table.insert(self.custom_ui_elements, Save_Btn)

            --#endregion

            --#region 关闭按钮 (使用 ImageButton 和 Image)
            local Close_Btn = self:AddChild(ImageButton("images/my_futuristic_ui/my_futuristic_ui.xml","hexagonal_up_button_normal.tex","hexagonal_up_button_hover.tex","hexagonal_up_button_disabled.tex"))
            Close_Btn:SetScale(1,1,1) -- 设置按钮缩放比例
            Close_Btn:SetTooltip(strings.Btn_Close_ToolTip)
            Close_Btn:SetOnClick(function () 
                self:Close() -- 关闭容器界面
            end)
            local closeBtnIcon = Close_Btn:AddChild(Image("images/my_futuristic_ui/my_futuristic_ui.xml", "no_icon.tex")) -- 使用 Image
            closeBtnIcon:ScaleToSize(30,30) -- 调整图标大小
            closeBtnIcon:SetPosition(0,0)
            Close_Btn:SetPosition(500,300) -- 可能需要调整位置
            table.insert(self.custom_ui_elements, Close_Btn)

            --#endregion

            --#region 改变槽位背景
            for _, invslot in ipairs(self.inv) do
                invslot.bgimage:Kill() -- 销毁原有的背景图像
                -- 添加新的背景图像
                invslot.bgimage = invslot:AddChild(Image("images/my_futuristic_ui/my_futuristic_ui.xml", "transparent_slotbg.tex")) -- 设置槽位背景图像
            end
            --#endregion
            
            --#region 为了以防万一槽位内有物品导致tile没有隐藏的问题
            HideSpecialItemBg() -- 调用隐藏特殊物品背景的函数
            --#endregion
        end
    end
    function self:Close()
        for _, ui_element in ipairs(self.custom_ui_elements) do -- 遍历所有存储的自定义 UI 元素
            ui_element:Kill() -- 销毁 UI 元素，释放资源并从界面移除
        end
        self.custom_ui_elements = {} -- 清空自定义 UI 元素列表 (虽然元素已 Kill，清空列表是个好习惯)
        --#region 将容器内物品返还到玩家身上
        if self.container ~= nil and self.doer ~= nil then
            if self.container.prefab == db.Prefab_ID then
                self.container.SoundEmitter:PlaySound("Shadow_Field_Exciter_soundfx/Shadow_Field_Exciter_container/close") -- 播放关闭容器的音效
                local num_slots = self.container.components.container:GetNumSlots()
                for slot = 1, num_slots, 1 do
                    local item = self.container.components.container:GetItemInSlot(slot)
                    if item then
                        local remove_item = self.container.components.container:RemoveItem(item,true)
                        self.doer.components.inventory:GiveItem(remove_item) -- 将物品移动到玩家身上
                    end
                end
            end
        end
        --#endregion
        _Close(self) -- 调用原始的 Close 方法
    end

    function self:OnItemGet(data) -- 重写 OnItemGet 方法，隐藏物品的背景
        _OnItemGet(self,data) -- 调用原始的 OnItemGet 方法，执行默认的物品获取逻辑
        if self.instance and self.instance.prefab == db.Prefab_ID then
            if data.slot and self.inv[data.slot] and self.inv[data.slot].tile then
                if self.inv[data.slot].tile.bg then
                    self.inv[data.slot].tile.bg:Hide() -- 隐藏默认的背景图像
                end

                if self.inv[data.slot].tile.spoilage then
                    self.inv[data.slot].tile.spoilage:Hide() -- 隐藏腐烂进度条
                end

                if self.inv[data.slot].tile.wetness then
                    self.inv[data.slot].tile.wetness:Hide() -- 隐藏 潮湿度 进度条
                end

                if self.inv[data.slot].tile.fusebg then
                    self.inv[data.slot].tile.fusebg:Hide() -- 隐藏 fusebg 进度条
                end

                if self.inv[data.slot].tile.invspace then
                    self.inv[data.slot].tile.invspace:Hide() -- 隐藏 invspace 进度条
                end

                if self.inv[data.slot].tile.obsidian_charge then
                    self.inv[data.slot].tile.obsidian_charge:Hide() -- 隐藏 obsidian_charge 进度条
                end
            end
        end
    end
end)
